/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

 /* 1. 代码随想录 */
 bool isLeaf(struct TreeNode* node) {
    return node != NULL && node->left == NULL && node->right == NULL;
}

int sumOfLeftLeaves(struct TreeNode* root) {
    if (root == NULL) return 0;

    int leftSum = 0;

    // 如果左子节点是叶子节点，加上它的值
    if (isLeaf(root->left)) {
        leftSum += root->left->val;
    }

    // 递归处理左子树和右子树
    leftSum += sumOfLeftLeaves(root->left);
    leftSum += sumOfLeftLeaves(root->right);

    return leftSum;
}

/* 2. 实现一 */
 typedef struct TreeNode TreeNode;

 // step 1# 定义全局变量用于累加所有左叶子节点的值
 int sumLeft;
 
 // step 2# 辅助递归函数，遍历整棵树，寻找左叶子节点
 void getLeftSum(TreeNode *root) {
     // step 2.1# 如果当前是叶子节点，则不处理直接返回（因为没有子节点）
     if (root->left == NULL && root->right == NULL) return;
 
     // step 2.2# 如果当前节点的左孩子是“叶子节点”，累加它的值
     if (root->left != NULL && root->left->left == NULL && root->left->right == NULL) {
         sumLeft += root->left->val;
     }
 
     // step 2.3# 继续递归遍历左子树
     if (root->left != NULL) {
         getLeftSum(root->left);
     }
 
     // step 2.4# 继续递归遍历右子树
     if (root->right != NULL) {
         getLeftSum(root->right);
     }
 }
 
 // step 3# 主函数入口
 int sumOfLeftLeaves(struct TreeNode* root) {
     sumLeft = 0;          // 初始化累计值
     getLeftSum(root);     // 启动递归查找左叶子
     return sumLeft;       // 返回最终结果
 }
 